home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / sos3-2.lha / bin / CC.modified next >
Text File  |  1992-02-13  |  9KB  |  454 lines

  1. #!/bin/sh
  2. PATH=/bin:/usr/bin
  3. #ident    "@(#)ctrans:CC    1.7.3.1"
  4.  
  5. # Modified J. Uhl 14/05/1990
  6. # - handle -o Option in NOLOAD case: substitute
  7. #    (cd $TEMPDIR; $ccC $P $NLO $X)        # compile, no load
  8. #   through
  9. #    (cd $TEMPDIR; $ccC $P $NLO $OF $X)    # compile, no load
  10. # - remove cpp line comments for .h files from the result of cfront
  11. #   (causing a bus error in subsequent cpp runs)
  12.  
  13. #NOTE: To properly use the CC command you should check the values of the
  14. #following variables to be sure they are set to the locations of the
  15. #appropriate translator files on your system.
  16. #
  17. #CCROOTDIR set to directory containing cfront c++filt and patch/munch
  18. #CCLIBDIR set to directory containing the C++ libraries
  19. #I set to directory containing C++ header files
  20.  
  21. CCROOTDIR=${CCROOTDIR-/usr/local/bin}
  22. CCLIBDIR=${CCLIBDIR-/usr/local/lib}
  23. I=${I-/usr/local/include/CC}
  24.  
  25. #Option passed to cc to tell linker to look for libraries in another
  26. #directory.  Set it to -L if -Wl,-L doesn't work.
  27. LOPT=-L
  28.  
  29. trap 'rm -fr $TEMPDIR; exit' 1 2 3 15
  30.  
  31. #    main makefile will set PM_FLAG to MUNCH (default) or PATCH
  32. PM_FLAG=PATCH
  33.  
  34. DEMANGLE=${DEMANGLE-1}    # set to 0 to disable linker output demangling
  35.  
  36. if test "$CCROOTDIR" != "" ;then
  37.     CCROOTDIR="$CCROOTDIR/"
  38. fi
  39.  
  40. LIB_ID=${LIB_ID-C}
  41. LIBRARY=${LIBRARY--l${LIB_ID}}
  42. cfrontC=${cfrontC-${CCROOTDIR}cfront}
  43.  
  44. if test "$PM_FLAG" = "PATCH"
  45. then
  46.     patchC=${patchC-${CCROOTDIR}patch}
  47. else
  48.     munchC=${munchC-${CCROOTDIR}munch}
  49.     NM=${NM-nm}
  50.     NMFLAGS=${NMFLAGS-}
  51. fi
  52.  
  53. cplusfiltC=${cplusfiltC-${CCROOTDIR}c++filt}
  54. ccC=${ccC-cc}
  55. cppC=${cppC-/lib/cpp}
  56.  
  57. if test "$CCLIBDIR" = "/usr/lib"
  58. then LLIBPATH=""
  59. else LLIBPATH="$LOPT$CCLIBDIR"
  60. fi
  61.  
  62. #sys.fix will set SYS to the designated system
  63. #it will then be defined for each CC invocation
  64. SYS=-DBSD
  65.  
  66. #For Ansi compatibility, c_plusplus => __cplusplus
  67. #For backward compatibility, retain c_plusplus for 2.0
  68. CPLUS=-Dc_plusplus=1
  69. cPLUS=-D__cplusplus=1
  70.  
  71. TMPDIR=${TMPDIR-"/usr/tmp"}
  72. TEMPDIR=$TMPDIR/CC.$$
  73. C= EE=0 FON= XON= O=
  74. PON= R= SUF= X= Y= DASHR= PLUSI= STRIP=
  75. Z= E=0 OF= P=
  76. NOLOAD= NLO=
  77. AFAIL=0
  78. OO="a.out"
  79. ISUF=".c"
  80. MVLIST=
  81. APASS=0
  82. defmem=D deflist=
  83.  
  84. rm -fr $TEMPDIR
  85. mkdir $TEMPDIR
  86. E=$?
  87. if test $E -ne 0
  88. then
  89.      echo "CC: error:can not create temporary directory in $TEMPDIR: stop" 1>&2
  90.      exit $E
  91. fi
  92. for A do
  93.     case $A in
  94.     -Yp,*)    cppC=`expr $A : '-Yp,\(.*\)'`/`basename ${cppC}`
  95.         X="$X $A"
  96.         ;;
  97.     -YI*)    X="$X $A"
  98.         ;;
  99.     -Y*)    Z="$Z $A"
  100.         ;;
  101.     +S)    echo "CC: +S no longer accepted (ignored)"
  102.         ;;
  103.     +V)    echo "CC: +V no longer accepted (ignored)"
  104.         ;;
  105.     +i)    PLUSI=1
  106.         ;;
  107.     -s)    STRIP=1
  108.         ;;
  109.     +x)    XON=1
  110.         ;;
  111.     +*)    O="$O $A"
  112.         ;;
  113.     -E)    PON=1
  114.         ;;
  115.     -F)    FON=1
  116.         ;;
  117.     -Fc)    FON=1
  118.         O="$O +L"
  119.         ;;
  120.     -C)    Y="$Y $A"
  121.         ;;
  122.     -S*)    NOLOAD=".s"
  123.         NLO="$A"
  124.         ;;
  125.     -P)    NOLOAD=".i"
  126.         NLO="-P"
  127.         ;;
  128.     -c*)    NOLOAD=".o"
  129.         NLO="-c"
  130.         ;;
  131.     -I*)     if test "$A" != "-I" 
  132.         then
  133.                       Y="$Y $A"
  134.         else
  135.             ION=1
  136.                 fi
  137.         ;;
  138.     -D*)    eval $defmem='"$A"'
  139.         deflist="$deflist \"\$$defmem\""
  140.         defmem=${defmem}x
  141.         ;;
  142.     -U*)    Y="$Y $A"
  143.         ;;
  144.     -p)    P="-p"
  145.         ;;
  146.     -r)    DASHR=1
  147.         Z="$Z $A"
  148.         ;;
  149.     -o*)    if test "$A" != "-o" 
  150.         then
  151.             OO=`expr $A : '-o\(.*\)'`
  152.                       A="-o $OO"
  153.         else
  154.             OX=1
  155.                 fi
  156.         APASS=1
  157.         OF="$OF $A"
  158.         Z="$Z $A"
  159.         ;;
  160.     -.c)    echo "bad suffix option: -.c" 1>&2
  161.         ;;
  162.     -.*)    SUF=`expr "$A" : '-\(.*\)'`
  163.         ;;
  164.     *.[Cc]) if    test -f $A
  165.         then
  166.  
  167.             case $A in
  168.                 *.c) B=`basename $A .c` ;;
  169.                 *.C) B=`basename $A .C` ;;
  170.             esac
  171.  
  172.             if    test $PON
  173.             then
  174.                 if test $SUF
  175.                 then
  176.                     echo "$cppC $O  $A > $B$SUF:" 1>&2
  177.                     eval '$cppC' '$Y' $deflist '$CPLUS' '$cPLUS' '$SYS' '-I$I'  '$A' >'$B$SUF'
  178.                     E=$?
  179.                 else
  180.                     eval '$cppC' '$Y' $deflist '$CPLUS' '$cPLUS' '$SYS' '-I$I'  '$A'
  181.                     E=$?
  182.                 fi
  183.                 case $E in
  184.                 0)    ;;
  185.                 *)    AFAIL=1; break
  186.                     ;;
  187.                 esac
  188.             elif    test $FON
  189.             then
  190.                 if test $SUF
  191.                 then
  192.                     echo "$cfrontC $O  $A > $B$SUF:" 1>&2
  193.                     eval '$cppC' -C '$Y' $deflist '$CPLUS' '$cPLUS' '$SYS' '-I$I'  '$A' >$TEMPDIR/cpptmp
  194.                     E=$?
  195.                     if test $E -ne 0
  196.                     then
  197.                         echo "CC: cpp failure: $E" 1>&2
  198.                         AFAIL=1; break
  199.                     fi
  200.                     $cfrontC +L +f$A $O <$TEMPDIR/cpptmp >$B$SUF
  201.                     E=$?
  202.                 else    
  203.                     eval '$cppC' -C '$Y' $deflist '$CPLUS' '$cPLUS' '$SYS' '-I$I'  '$A' >$TEMPDIR/cpptmp
  204.                     E=$?
  205.                     if test $E -ne 0
  206.                     then
  207.                         echo "CC: cpp failure: $E" 1>&2
  208.                         AFAIL=1; break
  209.                     fi
  210.                     $cfrontC +L +f$A $O <$TEMPDIR/cpptmp 
  211.                     E=$?
  212.                 fi
  213.                 case $E in
  214.                 0)    ;;
  215.                 *)    AFAIL=1; break
  216.                     ;;
  217.                 esac
  218.             else
  219.                 echo "CC $O $A:" 1>&2
  220.                 eval '$cppC' -C '$Y' $deflist '$CPLUS' '$cPLUS' '$SYS' '-I$I'  '$A' >$TEMPDIR/cpptmp
  221.                 E=$?
  222.                 if test $E -ne 0
  223.                 then
  224.                     echo "CC: cpp failure: $E" 1>&2
  225.                     AFAIL=1; break
  226.                 fi
  227.                 $cfrontC +L +f$A $O <$TEMPDIR/cpptmp |
  228.                 egrep -v '^#line.*\.h\"' >$TEMPDIR/$B$ISUF
  229.                 E=$?
  230.                 R=1
  231.                 C="$C $TEMPDIR/$B$ISUF"
  232.                 case $E in
  233.                 0)    X="$X $B$ISUF"
  234.                     if test "$NOLOAD" != ".c" 
  235.                     then
  236.                         Z="$Z $TEMPDIR/$B.o"
  237.                     fi
  238.                     MVLIST="$MVLIST $B"
  239.                     APASS=1
  240.                     ;;
  241.                 127)    echo "Too many compilation errors" 1>&2
  242.                     AFAIL=1
  243.                     ;;
  244.                 999)    echo "CC argument error" 1>&2
  245.                     AFAIL=1
  246.                     ;;
  247.                 1)    echo "1 error" 1>&2
  248.                     AFAIL=1
  249.                     ;;
  250.                 *)    echo "$E errors" 1>&2
  251.                     AFAIL=1
  252.                     ;;
  253.                 esac
  254.             fi
  255.         else
  256.             echo "$A not found" 1>&2
  257.             EE=1
  258.         fi
  259.         ;;
  260.     *.i)    if test -f $A
  261.         then
  262.  
  263.             if test $PON
  264.             then
  265.                 echo "CC -E $A incompatible: ignoring $A" 1>&2
  266.                 else
  267.                 if test $FON
  268.                 then
  269.                     eval '$cppC' -C '$Y' $deflist '$CPLUS' '$cPLUS' '$SYS' '-I$I'  '$A' >$TEMPDIR/cpptmp
  270.                     if test $? -ne 0
  271.                     then
  272.                         echo "CC: cpp failure: $E" 1>&2
  273.                         AFAIL=1; break
  274.                     fi
  275.                     $cfrontC +L +f$A $O <$TEMPDIR/cpptmp 
  276.                     if test $? -ne 0
  277.                     then
  278.                         AFAIL=1
  279.                     fi
  280.                   else    
  281.                     B=`basename $A .i`
  282.                     echo "CC $O $A:" 1>&2
  283.                     $cfrontC +L +f$A $O < $A > $TEMPDIR/$B$ISUF
  284.                     E=$?
  285.                     R=1
  286.                     C="$C $TEMPDIR/$B$ISUF"
  287.                     case $E in
  288.                     0)    X="$X $B$ISUF"
  289.                         if test "$NOLOAD" != "-c" 
  290.                         then
  291.                             Z="$Z $TEMPDIR/$B.o"
  292.                         fi
  293.                         MVLIST="$MVLIST $B"
  294.                         APASS=1
  295.                         ;;
  296.                     *)    AFAIL=1
  297.                         ;;
  298.                 esac
  299.                 fi
  300.             fi
  301.  
  302.         else
  303.             echo "$A not found" 1>&2
  304.             EE=1
  305.         fi
  306.         ;;
  307.     *.s)    # add to list to be compiled in $TEMPDIR, set flag to go on
  308.         B=`basename $A .s`
  309.         X="$X $B.s"
  310.         cp $A $TEMPDIR/$B.s
  311.         APASS=1
  312.  
  313.         if test "$NOLOAD" != "-c" 
  314.         then
  315.             # add object entry to the load list
  316.             Z="$Z $TEMPDIR/$B.o"
  317.         fi
  318.         ;;
  319.     *)    if test $XON
  320.         then    
  321.             O="$O +x$A"
  322.             XON=""
  323.         elif test $ION
  324.         then
  325.             Y="$Y -I$A"
  326.             ION=""
  327.         else
  328.             Z="$Z $A"
  329.             if test $OX
  330.             then
  331.                 OO=$A
  332.                 OF="$OF $A"
  333.                 OX=""
  334.             else
  335.                 X="$X $A"
  336.             fi
  337.         fi
  338.          APASS=1 # setting APASS to 1 causes link step to execute
  339.         ;;
  340.     esac
  341. done
  342.  
  343. case $APASS in
  344. 0)    ;;
  345. *)                    # generate code
  346.     if test "$PLUSI"        #leave ..c's lying around
  347.     then
  348.             #remove #line's from the ..c's for sdb
  349.         for f in $C
  350.         do
  351.             sed "/^#/d" $f >$TEMPDIR/temp
  352.             mv $TEMPDIR/temp $f 2> /dev/null
  353.         done
  354.     fi
  355.     
  356.     #if one file failed in cpp or cfront then do not create a.out
  357.     if test $AFAIL -eq 1
  358.     then
  359.         if test -z "$NOLOAD"
  360.         then
  361.             NOLOAD=".o"
  362.             NLO="-c"
  363.                 fi
  364.         fi 
  365.  
  366.         if test "$NOLOAD"
  367.         then
  368.          # make sure there are some .c, .s, or .i files in X
  369.          ANY_CS=`expr "$X" : '.*\(\.[CcSsi]\).*'`
  370.          if test "$ANY_CS"
  371.          then
  372.              echo "$ccC $P $NLO $OF $X" 1>&2
  373.                # contortions to cope with bug handling path in cc
  374.                (cd $TEMPDIR; $ccC $P $NLO $OF $X)    # compile, no load
  375.              EE=$?
  376.                if test $EE = 0
  377.                then
  378.                  # move products back into current directory
  379.                    mv $TEMPDIR/*$NOLOAD . 2> /dev/null
  380.                fi
  381.          fi
  382.     else
  383.         echo "$ccC $P $LLIBPATH $OF $X $LIBRARY" 1>&2
  384.           (cd $TEMPDIR; $ccC $P -c $X)            # compile, no load
  385.         EE=$?
  386.         case $EE in
  387.         0) # load
  388.             $ccC $P $LLIBPATH $Z $LIBRARY >$TEMPDIR/__err 2>&1
  389.             EE=$?
  390.             (test $DEMANGLE = 1 &&
  391.              $cplusfiltC <$TEMPDIR/__err 2>/dev/null) ||
  392.             cat $TEMPDIR/__err
  393.  
  394.             if test $EE = 0  -a "$DASHR" != 1
  395.             then    #find ctors/dtors
  396.                 case $PM_FLAG in
  397.                 PATCH)
  398.                     $patchC $OO
  399.                     EE=$?
  400.                     ;;
  401.                 *)
  402.                     CTDT=__ctdt$$
  403.                     TCTDT=${TEMPDIR}/${CTDT}
  404.                     $NM $NMFLAGS $OO | \
  405.                         $munchC $P > ${TCTDT}.c
  406.                     $ccC -c ${TCTDT}.c && \
  407.                         $ccC $P $LLIBPATH ${CTDT}.o $Z $LIBRARY
  408.                     EE=$?
  409.                     rm ${CTDT}.o
  410.                     ;;
  411.                 esac
  412.                 if test "$STRIP"
  413.                 then
  414.                     strip $OO
  415.                 fi
  416.             fi
  417.                         COUNT=0 
  418.                         for A in $X
  419.                         do 
  420.                            COUNT="`expr $COUNT + 1`"
  421.                         done
  422.                         if test $COUNT -gt 1
  423.                         then
  424.                            mv $TEMPDIR/*.o . 2> /dev/null
  425.                         fi
  426.             ;;
  427.         esac
  428.     fi
  429. esac
  430.  
  431. if test "$R"
  432. then
  433.    if test "$PLUSI"
  434.    then
  435.      for A in $MVLIST
  436.      do
  437.          mv $TEMPDIR/$A${ISUF} $A.${ISUF} 2> /dev/null
  438.      done
  439.    fi
  440. fi
  441.  
  442. rm -fr $TEMPDIR
  443.  
  444. if test $AFAIL -ne 0
  445. then
  446.     exit $AFAIL
  447. fi
  448.  
  449. case $E in
  450. 0)    exit $EE
  451.     ;;
  452. *)    exit $E
  453. esac
  454.